/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Controller;

import Model.Cliente;
import Model.Produto;
import Model.Venda;
import java.sql.Date;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

/**
 *
 * @author iron
 */
public class VendaDAO {
    public static final VendaDAO INSTANCE = new VendaDAO();
    BancoDeDados bd = new BancoDeDados();
    
    public void insereVenda(Cliente cli, Produto prod, Integer quant, String nomeMedico, Integer crm, String receita, Integer desconto) throws Exception{
        bd.conectar();
        bd.sql = "INSERT INTO \"Venda\" values(?,?,?,?,?,?,?,?);";
        bd.comandoSql = bd.connection.prepareStatement(bd.sql);
        bd.comandoSql.setLong(1, cli == null ? 0 : cli.getCpf());
        bd.comandoSql.setInt(2, prod.getId());
        bd.comandoSql.setInt(3, quant);
        bd.comandoSql.setDate(4,new Date(new java.util.Date().getTime()));
        bd.comandoSql.setString(5, !prod.getExigeReceita()?"":nomeMedico);
        bd.comandoSql.setInt(6, !prod.getExigeReceita()?0:crm);
        bd.comandoSql.setString(7,receita);
        bd.comandoSql.setInt(8, desconto);
        bd.comandoSql.executeUpdate();
        bd.desconectar();
    }
    
    public long quantidadeVendasCliente(Cliente cli) throws Exception{
        
        bd.conectar();
        bd.sql = "SELECT count(*) FROM \"Venda\" WHERE \"cpf\" = ? ;";
        bd.comandoSql = bd.connection.prepareStatement(bd.sql);
        bd.comandoSql.setLong(1, cli.getCpf());

        ResultSet rs = bd.comandoSql.executeQuery();
        Long qtde = null;
        while(rs.next()) {
            qtde = rs.getLong(1);
        }
        bd.desconectar();
        return qtde;
    
    }
    
    public ArrayList<Venda> listaVendasCliente(Cliente cli) throws SQLException, Exception{
        ArrayList<Venda> vendas = new ArrayList<Venda>();
        
        bd.sql = "SELECT * FROM \"Venda\" v where \"cpf\" = ? inner join \"Produto\" using(\"id\");";
        bd.comandoSql = bd.connection.prepareStatement(bd.sql);
        bd.comandoSql.setLong(1, cli.getCpf());
        ResultSet rs = bd.comandoSql.executeQuery();
        bd.desconectar();
        Produto prod = null;
        Integer qtde = null;
        Date data    = null;
        String nomeMedico = null;
        Integer crm  = null;
        String receita    = null;
        Long desconto;
        while(rs.next()){
            prod = new Produto(
                    rs.getInt(1),
                    rs.getString(8),
                    rs.getString(9),
                    rs.getString(10),
                    rs.getString(11),
                    rs.getDouble(12),
                    ((String)rs.getObject(13)).charAt(0),
                    rs.getBoolean(14));
            
            qtde = rs.getInt(3);
            data = rs.getDate(4);
            nomeMedico = rs.getString(5);
            crm = rs.getInt(6);
            receita = rs.getString(7);
            desconto = rs.getLong(8);
            vendas.add(new Venda(cli, prod, qtde, nomeMedico, crm, receita, data, desconto.intValue()));
        }
        
        return vendas;
    }
    
    public int vendasProduto(Produto p, java.util.Date i, java.util.Date f) throws Exception{
        Date inicio = new Date(i.getTime());
        Date fim    = new Date(f.getTime());
        int total= 0;
        ArrayList<Venda> lista = new ArrayList<Venda>();
        bd.conectar();
        bd.sql = "select count(*) from \"Venda\" where \"data\" < ? and \"data\" > ? and \"id\" = ?";
        bd.comandoSql = bd.connection.prepareStatement(bd.sql);
        bd.comandoSql.setDate(1, fim);
        bd.comandoSql.setDate(2, inicio);
        bd.comandoSql.setInt(3, p.getId());
        ResultSet rs = bd.comandoSql.executeQuery();
        while(rs.next()) {
            total  = rs.getInt(1);
        }
        bd.desconectar();
        System.out.println(inicio.toString());
        System.out.println(fim.toString());
        System.out.println(total);
        return total;
                
    }
    
    
    public ArrayList<Venda> vendasProduto(java.util.Date i, java.util.Date f) throws Exception{
        Date inicio = new Date(i.getTime());
        Date fim    = new Date(f.getTime());
        ArrayList<Venda> lista = new ArrayList<Venda>();
        bd.conectar();
        bd.sql = "select * from \"Venda\" where \"data\" > ? and \"data\" < ?";
        bd.comandoSql = bd.connection.prepareStatement(bd.sql);
        bd.comandoSql.setDate(1, inicio);
        bd.comandoSql.setDate(2, fim);
       
        ResultSet rs = bd.comandoSql.executeQuery();
        bd.desconectar();
        
        Cliente c;
        Produto p;
        Integer quantidade;
        Date data;
        String nomeMedico;
        Integer crm;
        String receita;
        Integer desconto;
        
        while(rs.next()){
          c          = ClienteDAO.INSTANCE.findByCPF(rs.getLong(1));
          p          = ProdutoDAO.INSTANCE.findById(rs.getInt(2));
          quantidade = rs.getInt(3);
          data       = rs.getDate(4);
          nomeMedico = rs.getString(5);
          crm        = rs.getInt(6);
          receita    = rs.getString(7);
          desconto   = rs.getInt(8);
          
          lista.add(new Venda(c, p, quantidade, nomeMedico, crm, receita, data, desconto));
        }
        
        return lista;
                
    }

    public int vendasCliente(Cliente c, java.util.Date ini, java.util.Date f) throws Exception {
        Date inicio = new Date(ini.getTime());
        Date fim    = new Date(f.getTime());
        ArrayList<Venda> lista = new ArrayList<Venda>();
        int total = 0;
        bd.conectar();
        bd.sql = "select count(*) from \"Venda\" v inner join \"Cliente\" c using(\"cpf\") where \"data\" > ? and data < ? and \"cpf\" = ?";
        bd.comandoSql = bd.connection.prepareStatement(bd.sql);
        bd.comandoSql.setDate(1, inicio);
        bd.comandoSql.setDate(2, fim);
        bd.comandoSql.setLong(3, c.getCpf());
        ResultSet rs = bd.comandoSql.executeQuery();
        while(rs.next()) {
            total = rs.getInt(1);
        }        
        bd.desconectar();
        System.out.println();
        System.out.println(inicio.toString());
        System.out.println(fim.toString());
        System.out.println(total);
        return total;
    }
}
